package entidades.politica;

import java.util.ArrayList;

import util.exceptions.NaoExisteBlocoASerTrocadoException;

import entidades.Peer;

public abstract class PoliticaSelecaoBlocos {

	/**
	 * Seleciona um bloco de peerOrigem para ser entregue ao peerDestino.
	 * 
	 * @param peerOrigem
	 * @param peerDestino
	 * @return
	 * @throws NaoExisteBlocoASerTrocadoException 
	 */
	public abstract int seleciona(Peer peerOrigem, Peer peerDestino) throws NaoExisteBlocoASerTrocadoException;

	/**
	 * Seleciona um bloco de Seed/Publisher para ser entregue ao peerDestino.
	 * 
	 * @param peerDestino
	 * @return 
	 */
	public abstract int seleciona(Peer peerDestino);
	
	/**
	 * Seleciona os blocos úteis a serem trocados entre Seed/Publisher e peerDestino.
	 * 
	 * @param peerDestino
	 * @return 
	 */
	protected final ArrayList<Integer> selecionaBlocosUteis(Peer peerDestino) {
		ArrayList<Integer> blocosUteis = new ArrayList<Integer>();
		
		for (int i = 0; i < peerDestino.getAssinatura().length(); i++) {
			if (peerDestino.getAssinatura().charAt(i) == '0') {
				blocosUteis.add(i);
			}
		}
		
		return blocosUteis;
	}
	
	/**
	 * Seleciona os blocos úteis a serem trocados entre peerOrigem e peerDestino.
	 * @param peerOrigem
	 * @param peerDestino
	 * @return
	 */
	protected final ArrayList<Integer> selecionaBlocosUteis(Peer peerOrigem, Peer peerDestino) {
		ArrayList<Integer> blocosUteis = new ArrayList<Integer>();
		
		for (int i = 0; i < peerOrigem.getAssinatura().length(); i++) {
			if (peerOrigem.getAssinatura().charAt(i) == '1' && peerDestino.getAssinatura().charAt(i) == '0') {
				blocosUteis.add(i);
			}
		}
		
		return blocosUteis;
	}

}
